package com.util;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 提供日期与字符串之间相互转换
 */
public class DateConvertUtil {

	/**
	 * 将string转换成date日期
	 * @param strDate 字符串型日期
	 * @return Date型日期
	 */
	public static Date convertStringToDate(String strDate){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date = null;
		try {
			date = sdf.parse(strDate);
		} catch (ParseException e) {
			// Auto-generated catch block
			e.printStackTrace();
		}
		return date;
	}
	
	/**
	 * 将字符串转换成带时分秒格式的时间
	 * @param strDate
	 * @return
	 */
	public static Date convertStringTolongDate(String strDate){
		if(StringUtils.isBlank(strDate)){
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = null;
		try {
			date = sdf.parse(strDate);
		} catch (ParseException e) {
			// Auto-generated catch block
			e.printStackTrace();
		}
		return date;
	}
	
	/**
	 * 将date类型转换成String
	 * 格式：yyyy/MM/dd HH:mm:ss
	 * @param date
	 * @return
	 */
	public static String convertDateToSpritString(Date date){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/M/d HH:mm:ss");
		String strDate = "";
		try {
			strDate = sdf.format(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return strDate;
	}
	
	/**
	 * 将date类型转换成String
	 * 格式：yyyy-MM-dd
	 * @param date 
	 * @return
	 */
	public static String convertDateToShortString(Date date){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String strDate = "";
		try {
			strDate = sdf.format(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return strDate;
	}
	
	/**
	 * 将date类型转换成String
	 * 格式：MM-dd
	 * @param date 
	 * @return
	 */
	public static String convertDateToShortString2(Date date){
		SimpleDateFormat sdf = new SimpleDateFormat("MM-dd");
		String strDate = "";
		try {
			strDate = sdf.format(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return strDate;
	}
	
	/**
	 * 将date类型转换成String
	 * 格式：yyyy-MM-dd HH:mm:ss
	 * 注：可进一步扩展返回格式,如：yyyy-MM-dd
	 * @param date 
	 * @return
	 */
	public static String convertDateToString(Date date){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String strDate = "";
		try {
			if(date == null){
				return strDate;
			}
			strDate = sdf.format(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return strDate;
	}
	
	/**
	 * 将时间戳类型转换成Date
	 * 格式：yyyy-MM-dd HH:mm:ss
	 * @param time
	 * @return
	 */
	public static Date convertTimestampToDate(Date time){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = null;
		try {
			String strDate = sdf.format(time);
			date = sdf.parse(strDate);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return date;
	}
	
	/**
	 * 将时间戳类型转换成字符串
	 * 格式：yyyy-MM-dd HH:mm:ss
	 * @param timestamp
	 * @return
	 */
	public static String convertTimestampToStringDate(String timestamp){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String sd = "";
		try {
			sd = sdf.format(new Date(Long.parseLong(timestamp))); 
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sd;
	}
	
	/**
	 * 将字符串日期转换成时间戳类型字符串
	 * @param time
	 * @return
	 */
	public static String convertDateToTimestamp(String time){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String sd = "";
		try {
			Date date = sdf.parse(time);
			sd = String.valueOf(date.getTime());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sd;
	}
	
	/**
	 * 加天
	 * @param currTime
	 * @param x
	 * @return
	 */
	public static String addNextNumberDay(String currTime, int x) {
		//入参的格式
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 24小时制
		//出参的格式
		SimpleDateFormat newFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 24小时制
		Date date = null;
		try {
			date = format.parse(currTime);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		if (date == null)
			return "";
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.DATE, cal.get(Calendar.SECOND) + x);
		//得到结算后的结果 yyyy-MM-dd HH:mm
		date = cal.getTime();
		cal = null;
		//转换结果的格式 HH:mm
		return newFormat.format(date);
	}

	/**
	 * 日期转化为long类型时间戳
	 * @param date
	 * @return
	 */
	public static long convertDateToLongTimestamp(Date date) {
		long timestamp = 0;
		try {
			if(date == null){
				timestamp = (new Date()).getTime();
				return timestamp;
			}
			timestamp = date.getTime();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return timestamp;
	}
	
	/**
	 * 计算两个时间戳的时间差
	 * @param old_timestamp		原时间戳
	 * @param curr_timestamp	当前时间戳
	 * @return   时间差（单位：分钟）
	 */
	public static long getTimeDifference(long old_timestamp, long curr_timestamp) {
		long lag = 0;
		try {
			if(old_timestamp == 0 || curr_timestamp == 0){
				lag = 10;		//默认十分钟
				return lag;
			}
			
			lag = (curr_timestamp - old_timestamp)/60/1000;		//毫秒转分钟
		} catch (Exception e) {
			e.printStackTrace();
			lag = 10;
		}
		
		return lag;
	}

	/**
	 * 验证日期的合法性
	 * @param str
	 * @return
	 */
	public static boolean checkSimpleDateFormat (String str) {
		String formatStr = "";
		if(str.length()=="yyyy-MM-dd".length()){
			formatStr = "yyyy-MM-dd";
		}else if(str.length()=="yyyy-MM-dd HH".length()){
			formatStr = "yyyy-MM-dd HH";
		}else if(str.length()=="yyyy-MM-dd HH:mm".length()){
			formatStr = "yyyy-MM-dd HH:mm";
		}else if(str.length()=="yyyy-MM-dd HH:mm:ss".length()){
			formatStr = "yyyy-MM-dd HH:mm:ss";
		}
		SimpleDateFormat sd=new SimpleDateFormat(formatStr);//括号内为日期格式，y代表年份，M代表年份中的月份（为避免与小时中的分钟数m冲突，此处用M），d代表月份中的天数
		try {
			sd.setLenient(false);//此处指定日期/时间解析是否不严格，在true是不严格，false时为严格
			sd.parse(str);//从给定字符串的开始解析文本，以生成一个日期
		}catch (Exception e) {
			return false;
		}
		return true;
	}


}
